#pragma once
#include <iostream>
#include <pthread.h>
#include <string>
#include <cstring>
#include <cerrno>
#include <cstdio>
namespace thread_module
{
    class thread
    {
    using func_t=void(*)();
    private:
    static void* routine(void* arg)
    {
        thread* self=(thread*)arg;
        self->_is_running=true;
        self->_func();
        return nullptr;
    }
    public:
        thread(func_t func)
        :_tid(0),
        _name(""),
        _is_running(false),
        _is_detaching(false),
        _func(func){}
        void start()
        {
            if(_is_running)
            {
                printf("线程已经在运行了\n");
                return;
            }
            if(_is_detaching)
            {
                printf("线程已经分离了\n");
                return;
            }
            int n=pthread_create(&_tid,nullptr,routine,this);
            if(n!=0)
            {
                std::cerr<<strerror(n)<<std::endl;
                return;
            }
            printf("线程运行成功\n");

        }
        void detach()
        {
            if(!_is_running)
            {
                printf("线程还没运行\n");
                return;
            }
            if(_is_detaching)
            {
                printf("线程已经被分离了\n");
                return;
            }
            int n=pthread_detach(_tid);
            if(n!=0)
            {
                std::cerr<<strerror(n)<<std::endl;
                return;
            }
            _is_detaching=true;
            printf("线程分离成功\n");
        }
        void join()
        {
            if(_is_detaching)
            {
                printf("线程被分离了,无法等待\n");
                return;
            }
            if(!_is_running)
            {
                printf("线程还没启动,无法等待\n");
            }
            int n=pthread_join(_tid,nullptr);
            if(n!=0)
            {
                std::cerr<<strerror(n)<<std::endl;
                return;
            }
            printf("join成功\n");
        }
        ~thread(){}
    private:
        pthread_t _tid;
        std::string _name;
        bool _is_running;
        bool _is_detaching;
        void (*_func)();
        
    };
}